package com.gz.pass.prototype;

/**
 * @author juice-gz
 * date 2022-01-20
 * describe 年终奖类
 */
public class YearEndBonus implements Cloneable {
    private  String userName;
    private  String deptName;
    private  Integer  amount;

    public YearEndBonus(String userName, String deptName, Integer amount) {
        this.userName = userName;
        this.deptName = deptName;
        this.amount = amount;
    }

    public YearEndBonus() {
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public Integer getAmount() {
        return amount;
    }

    public void setAmount(Integer amount) {
        this.amount = amount;
    }

    @Override
    public String toString() {
        return "本公司" +
                "员工姓名：'" + userName + '\'' +
                ", 隶属部门：'" + deptName + '\'' +
                ", 年终奖金额" + amount +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        /**
         * 原型模式：
         * 1.定义：用一个已经创建的实例作为原型，通过复制该原型对象来创建一个和原型相同或相似的新对象。
         * 2.优点：Java自带的原型模式 Cloneable 可以提高性能，比new一个对象性能高。通过深层复制，可以实现版本控制。
         * 3.缺点：每个类都需要重写clone方法，违背开闭原则，深克隆耦合度高
         * 使用场景：对象类似，只要属性会改变，
         * 如：同一部门所有人年终奖都一样，只是名字不一样，
         * 如：悟空的猴毛，只是clone了多个，连属性都一样。
         */
        YearEndBonus yearEndBonus = new YearEndBonus("建哥","技术研发中心",30000);
        System.out.println(yearEndBonus.toString());
        YearEndBonus clone = (YearEndBonus) yearEndBonus.clone();
        clone.setUserName("王哥");
        System.out.println(clone.toString());
        /**输出结果：
         * 本公司员工姓名：'建哥', 隶属部门：'技术研发中心', 年终奖金额30000}
         * 本公司员工姓名：'王哥', 隶属部门：'技术研发中心', 年终奖金额30000}
         */

    }
}
